home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / c / jpl_c.zip / FREXP.C < prev    next >
Text File  |  1986-05-18  |  2KB  |  92 lines

  1. /* 1.1  07-10-84 */
  2. /************************************************************************
  3.  *            Robert C. Tausworthe                *
  4.  *            Jet Propulsion Laboratory            *
  5.  *            Pasadena, CA 91009        1985        *
  6.  ************************************************************************/
  7.  
  8. #include "defs.h"
  9. #include "stdtyp.h"
  10. #include "mathcons.h"
  11.  
  12. /************************************************************************/
  13.     double
  14. frexp(x, np)        /* returns mantissa of x and *np contains the
  15.                characteristic of x (i.e., log2(x)).        */
  16. /*----------------------------------------------------------------------*/
  17. double x;
  18. int *np;
  19. {
  20.     double ldexp();
  21.     int chrstc();
  22.  
  23.     return ldexp(x, -(*np = chrstc(x)));
  24. }
  25.  
  26. /*\p*********************************************************************/
  27.     double
  28. ldexp(x, m)    /* return value = x * (2^m)                */
  29.  
  30. /*----------------------------------------------------------------------*/
  31. double x;
  32. int m;
  33. {
  34.     FAST n;
  35.     int chrstc();
  36.     TBITS *xp;
  37.     LOCAL double raiseto[8] =
  38.         {1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0};
  39.  
  40.     if (x IS 0.0)
  41.         return 0.0;
  42.  
  43.     xp = (char *) &x;
  44.  
  45. #ifdef ECOSOFT
  46.     n = chrstc(x) + m;
  47.     *xp = (n = (n > 0x7f ? 0x7f : n) + 0x80);
  48. #endif
  49.  
  50. #ifdef AZTEC
  51.     n = m / 8;
  52.     if ((m %= 8) < 0)
  53.     {    n--;
  54.         m += 8;
  55.     }
  56.     if ((n += (*xp & 0x7f)) > 0x7f)
  57.         n = 0x7f;
  58.     *xp = n | (*xp & 0x80);
  59.     x *= raiseto[m];
  60. #endif
  61.  
  62. #ifdef CPM86
  63.     n = chrstc(x) + m;
  64.     n = (n > 0x400 ? 0x400 : n) + 0x3fe;
  65.     xp[7] = (xp[7] & 0x80) | ((n >> 4) & 0x7f);
  66.     xp[6] = (xp[6] & 0x0f) | (n << 4);
  67. #endif
  68.  
  69. #ifdef UNIVERSE
  70.     n = chrstc(x) + m;
  71.     n = (n > 0x7f ? 0x7f : n) + 0x80;
  72.     *xp = (*xp++ & 0x80) | ((n >> 1) & 0x7f);
  73.     *xp = (*xp & 0x7f) | (n & 1 ? 0x80 : 0);
  74. #endif
  75. /*\p*/
  76.  
  77. #ifdef SUN
  78.     n = chrstc(x) + m + 0x3fe;
  79.     if (n >= 0x7ff)
  80.         return INFINITY;
  81.  
  82.     *xp = (*xp & 0x80) | (n>>4);
  83.     xp[1] = (xp[1] & 0xf) | ((n & 0xf)<<4);
  84. #endif
  85.  
  86.     if (n < 1)
  87.         return 0.0;
  88.     else
  89.         return x;
  90. }
  91.  
  92.